package drp.snowbell.storage;

import drp.snowbell.entity.Property;

/**
 * 分页上下文.用法:如果要获取数据,则设置pageIndex,pageSize,order,
 * isAsc如果已知total也做为参数传入这样就减少一次获取数据总数的查询,但是这样可能也会存在数据已经增减但是页数不变.
 * 如果是返回数据则根据pageIndex,pageSize等值获取数据然后设置total;
 * 
 * @author jimmy
 * 
 */
public class PagingContext {

	private long total;
	private int pageIndex;
	private int pageSize;
	private Property order;
	private boolean isAsc;// 是否升序

	public void setTotal(long total) {
		this.total = total;
	}

	/**
	 * 总共数据数目
	 * 
	 * @return
	 */
	public long getTotal() {
		return total;
	}

	public void setPageIndex(int pageIndex) {
		this.pageIndex = pageIndex;
	}

	/**
	 * 当前第几页,从1开始
	 * 
	 * @return 页号
	 */
	public int getPageIndex() {
		return pageIndex;
	}

	/**
	 * 设置每页条数.如果<=0则为系统默认的值
	 * 
	 * @param pageSize
	 */
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	/**
	 * 每页多少条数据.
	 * 
	 * @return 条数
	 */
	public int getPageSize() {
		if (pageSize <= 0) {
			pageSize = Config.get().getDefaultPageSize();
		}
		return pageSize;
	}

	public void setOrder(Property order) {
		this.order = order;
	}

	/**
	 * 排序属性
	 * 
	 * @return 排序属性
	 */
	public Property getOrder() {
		return order;
	}

	/**
	 * 设置是否升序,true为升序,false为降序
	 * 
	 * @param isAsc
	 *            是否升序
	 */
	public void setAsc(boolean isAsc) {
		this.isAsc = isAsc;
	}

	/**
	 * 是否升序,true为升序,false为降序
	 * 
	 * @return 是否升序
	 */
	public boolean isAsc() {
		return isAsc;
	}

	/**
	 * 根据Total,PageIndex计算出第一条记录在所以记录的位置.
	 * 
	 * @return
	 */
	public long getFirstIndex() {
		if (pageIndex <= 0 && pageSize <= 0) {
			throw new IllegalArgumentException();
		}
		long ret = (pageIndex - 1) * pageSize;
		return ret;
	}

	/**
	 * 总共页数
	 * 
	 * @return
	 */
	public long getTotalPage() {
		if (total <= 0 && pageSize <= 0) {
			throw new IllegalArgumentException();
		}
		long ret = (long) Math.ceil((double) total / (double) pageSize);
		return ret;
	}
}
